package estudoregistry.control;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.security.InvalidParameterException;

public class Pesquisa implements Serializable {
    private static final int TAMANHO_PAGINA = 4096;
    private final File arquivo;
    private int totalPaginas;
    private int numPaginaAtual;

    public static Pesquisa newInstance(File arquivo) {
        if (!arquivoValido(arquivo)) throw new InvalidParameterException("Arquivo inválido");
        return new Pesquisa(arquivo);
    }

    private static boolean arquivoValido(File arquivo) {
        return arquivo!=null && arquivo.exists() && arquivo.isFile() && arquivo.canRead();
    }

    private Pesquisa(File arquivo) {
        this.arquivo = arquivo;

        long tamanhoArq = this.arquivo.length();
        int resto = (int) (tamanhoArq % TAMANHO_PAGINA);
        this.totalPaginas = (int) ((tamanhoArq - resto) / TAMANHO_PAGINA);
        if (resto > 0) this.totalPaginas++;
        setNumPaginaAtual(0);
    }

    public byte[] getPagina(int numPagina) throws FileNotFoundException, IOException {
        if (numPagina<1) throw new IndexOutOfBoundsException("Página deve ser maior do que zero");
        if (numPagina>this.getTotalPaginas()) throw new IndexOutOfBoundsException("Página deve ser menor do que " + (this.totalPaginas + 1));

        setNumPaginaAtual(numPagina);
        FileInputStream fis = new FileInputStream(this.arquivo);
        byte[] resposta = new byte[TAMANHO_PAGINA];

        if (getOffsetPagina() > 0) fis.skip(getOffsetPagina());
        fis.read(resposta);

        fis.close();
        return resposta;
    }

    public int getNumPaginaAtual() {
        return numPaginaAtual;
    }

    public int getOffsetPagina() {
        return (getNumPaginaAtual() - 1) * TAMANHO_PAGINA;
    }

    private void setNumPaginaAtual(int numPaginaAtual) {
        this.numPaginaAtual = numPaginaAtual;
    }

    public int getTotalPaginas() {
        return this.totalPaginas;
    }
}
